					
					package com.cn.utils;
					
					import java.io.FileOutputStream;
					import java.lang.reflect.Field;
					import java.lang.reflect.Method;
					import java.util.ArrayList;
					import java.util.List;
					
					import org.dom4j.Document;
					import org.dom4j.DocumentHelper;
					import org.dom4j.Element;
					import org.dom4j.io.OutputFormat;
					import org.dom4j.io.XMLWriter;
					
					public class XMLUtils {
						
									/**
									 * 反射输出xml文件
									 * @param list：需要向xml文件写入的数据
									 * @param c：传入的类名
									 * @throws Exception
									 */
									@SuppressWarnings("rawtypes")
									public static  void writeXML(List<Object> list,Class c) throws Exception{
										
										Element root=DocumentHelper.createElement(c.getSimpleName());
										Document doc=DocumentHelper.createDocument(root);
										Field[] field=c.getDeclaredFields();
										Method[] method =c.getMethods();
										Object value=null;
										for (Object object : list) {
												Element stu=DocumentHelper.createElement(c.getSimpleName().substring(0,3));
														for(Field fd:field){
															String  name="get"+fd.getName();
															value=getValue(method,name,object);//获取get方法的返回值
															Element node=DocumentHelper.createElement(fd.getName());
															node.setText(value+"");
															stu.add(node);
														}
												root.add(stu);
											}
											FileOutputStream out =new FileOutputStream(c.getSimpleName()+".xml");
											OutputFormat format=new OutputFormat("   ",true);
											XMLWriter writer=new XMLWriter(out, format);
											writer.write(doc);
									}
									
								//利用反射获取get方法，并返回相应的数据
								public static Object getValue(Method[] method,String name,Object object) throws Exception{
												for(Method me:method){//获取get方法
													if(name.equalsIgnoreCase(me.getName())){	
														if(me.getGenericReturnType() .equals("int")){//如果返回类型为int,需要转为String类型，否则会报错
																	return me.invoke(object)+""; 
														}else{
																	return me.invoke(object);
														}
													}	
												}
												return null;
								}
								
										/**
										* 利用反射将xmL中的数据设置到bean中	
										* @param root
										* @param c
										* @throws Exception
										*/
										@SuppressWarnings("unchecked")
								public static void setObject(Element root,Class c) throws Exception{
													Field[] attr=c.getDeclaredFields();
													Method[] method=c.getMethods();
													Object obj=null;
													List<Object> info=new ArrayList<Object>();
													List<Element> list=root.elements();
													for (Element element : list) {
															obj=c.newInstance();
														if(element.getName().equals("student")){
																	setValue(obj,method,attr,element);
														}	
															info.add(obj);
													}
													System.out.println(info);
									}
								
									//利用反射获取bean的set方法给该类的对象
									@SuppressWarnings("unchecked")
								public static void setValue(Object obj,Method[] method,Field[] attr,Element element){
													List<Element> list=element.elements();
													for (Element ele: list) {
													Method meth=null;
													for(int i=0;i<attr.length;i++){
														if(attr[i].getName().equalsIgnoreCase(ele.getName())){
																	   String setname="set"+attr[i].getName();
																	   for(int j=0;j<method.length;j++){
																		   	if(method[j].getName().equalsIgnoreCase(setname)){
																		   			meth=method[j];
																		   			Object value;
																try {		
																		   	if(meth.getParameterTypes()[0].getSimpleName().equalsIgnoreCase("int")){
																		   			value=Integer.parseInt(ele.getText().trim());
																		   	}else{
																		   			value=ele.getText().trim();
																		   	}
																		   	meth.invoke(obj,value);
																	 } catch (Exception e) {
																						e.printStackTrace();
																					}
																		   	}
																	   }
															  }
														 }
													}
								}
									
									
									/**
									 * 输出xml中的数据
									 * @param root
									 */
								@SuppressWarnings("unchecked")
								public static void getElement(Element root){
									List<Element> list=root.elements();
									for (Element element : list) {
											System.out.println(element.getName()+": "+element.getText().trim());
											getElement(element);
									}
								}
								
		}
